#include<queue>
#include"berth.h"
#include"config.h"

extern int current_frame;
int boat_capacity;
Boat boats[BOAT_NUM];
Berth berths[BERTH_NUM];

// 港口评分，用于绑定机器人
void Berth::SetScore(){
    // 目前score = 1 / 运输时间
    // 暂时没有考虑装货的时间，因为好像挺快的
    // 暂时假定为无限平面，没有考虑水和边界，太难了
    score = (float)10000.0 / transport_time;
}   
// 有新的机器人绑定港口，更新分数
void Berth::UpdateScore(){
    int distances[BERTH_NUM];
    int totaldistance = 0;       //船厂到其它9个船厂的曼哈顿距离之和
    for(int j = 0;j < BERTH_NUM;j++){
        if(j == idx) continue; // 跳过自己
        distances[j] = p.Distance(berths[j].p);
        totaldistance += distances[j];
    }
    // 更新score
    for(int j = 0;j < BERTH_NUM;j++){
        if(j == idx) continue; // 跳过自己
        berths[j].score += berths[j].score * BERTH_UPDATE_FACTOR * distances[j] / totaldistance;
    }
}   

// 去当前cargo数量最多的Berth
void Boat::GoToBerth(int i){
    std::priority_queue<Berth*, std::vector<Berth*>, BerthCargoCompare> heap; // 将Berth按照当前cargo数量
    for(int i = 0;i < BERTH_NUM;i++){
        // 剩余时间不够来回一趟
        if(berths[i].transport_time * 2 + boat_capacity / berths[i].loading_speed + 2 > TOTAL_FRAME - current_frame){
            continue;
        }
        heap.push(&berths[i]);
    }
    if(heap.size() == 0){ // 都来不及了
        printf("ship %d %d\n", i, 0); // 出发养老去吧
        return;
    }
    Berth* b = heap.top();
    (*b).currentcargo -= boat_capacity;

    wait = boat_capacity / (*b).loading_speed + 1; // 最多需要多少帧来装货
    (*b).boatcoming += 1;
    
    printf("ship %d %d\n", i, (*b).idx);
}

void Boat::Deliver(int i){
    if(berths[pos].currentcargo < 0){ // 表明其实没装满...
        berths[pos].currentcargo = 0;
    }
    printf("go %d\n", i);
}